package com.xuzimian.globaldemo.spring.springmvc.config;

import com.xuzimian.globaldemo.spring.springmvc.filter.MyFilter;
import com.xuzimian.globaldemo.spring.springmvc.servlet.MyServlet;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.*;

/**
 * 在 Servlet 3.0 环境下，Servlet 容器会在 classpath 下搜索实现了 javax.servlet.ServletContainerInitializer 接口的任何类，
 * 找到之后用它来初始化 Servlet 容器。
 *
 * Spring 实现了以上接口，实现类叫做 SpringServletContainerInitializer， 它会依次搜寻实现了 WebApplicationInitializer的任何类，
 * 实现WebApplicationInitializer的方式不再需要编写web.xml，实现了WebApplicationInitializer的具体类的onStartup函数会在Servlet
 * 容器启动时自动被调用，
 *
 * 从而实现了在方法内注册spring ioc容器以及DispatcherServlet。
 * 注意：本项目中已经有web.xml方式配置了web应用，如需启用需要删掉web.xml，并且去掉实现WebApplicationInitializer接口的注释
 *
 * @author xzm
 */
public class MyWebAppInitializer
/** 启动请去掉注释
 * implements WebApplicationInitializer
 */
{
    /**
     * 启动请去掉注释
     * 注意 DispatcherServlet 如果不配置WebApplicationContext上下文，就需要web.xml。
     * WebApplicationContext上下文可以用ComponentScan和Configuration配置的类
     */
    //@Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();

        webApplicationContext.register(RootConfig.class);
        webApplicationContext.refresh();


        //注册servlet，并配置映射路径
        //注意 DispatcherServlet 如果不配置WebApplicationContext上下文，就需要web.xml。
        DispatcherServlet dispatcherServlet = new DispatcherServlet(webApplicationContext);


        ServletRegistration.Dynamic dsServlet = servletContext.addServlet("appServlet", dispatcherServlet);
        dsServlet.addMapping("/");
        dsServlet.setLoadOnStartup(1);

        //注册自定义的servlet
        ServletRegistration.Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
        myServlet.addMapping("/myServlet");

        //注册fitler
        FilterRegistration.Dynamic filter = servletContext.addFilter("myFilter", MyFilter.class);
        filter.addMappingForUrlPatterns(null, false, "/*");
    }

}




